from flask import Blueprint, request, jsonify, current_app
from app import db
from app.models.banner import Banner
from app.utils.response import success_response, error_response
from flasgger import swag_from

user_banner_bp = Blueprint('user_banner', __name__)

@user_banner_bp.route('/banners', methods=['GET'])
@swag_from({
    'tags': ['Banner'],
    'summary': '获取有效Banner列表',
    'description': '用户端获取当前有效的Banner列表。只返回状态为启用且在有效时间范围内的Banner，按排序序号升序排列。',
    'responses': {
        200: {
            'description': '获取成功',
            'schema': {
                'type': 'object',
                'properties': {
                    'code': {'type': 'integer', 'example': 200, 'description': '状态码'},
                    'message': {'type': 'string', 'example': '获取成功', 'description': '响应消息'},
                    'data': {
                        'type': 'object',
                        'properties': {
                            'banners': {
                                'type': 'array',
                                'description': '有效的Banner列表（已过滤状态和时间）',
                                'items': {
                                    'type': 'object',
                                    'properties': {
                                        'id': {'type': 'integer', 'description': 'Banner ID'},
                                        'title': {'type': 'string', 'description': 'Banner标题'},
                                        'description': {'type': 'string', 'description': 'Banner描述'},
                                        'image_url': {'type': 'string', 'description': '图片URL地址'},
                                        'link_url': {'type': 'string', 'description': '跳转链接（external类型时使用）'},
                                        'link_type': {'type': 'string', 'enum': ['external', 'internal', 'venue', 'miniprogram', 'none'], 'description': '跳转类型：external=外部链接，internal=内部页面，venue=场馆详情，miniprogram=小程序跳转，none=纯展示无跳转'},
                                        'link_target': {'type': 'string', 'description': '跳转目标：internal类型为页面路径，venue类型为场馆ID，miniprogram类型为小程序页面路径'},
                                        'link_appid': {'type': 'string', 'description': '小程序AppID（miniprogram类型时使用）'},
                                        'sort_order': {'type': 'integer', 'description': '排序序号（已按此排序）'}
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        500: {
            'description': '服务器内部错误',
            'schema': {
                'type': 'object',
                'properties': {
                    'code': {'type': 'integer', 'example': 500},
                    'message': {'type': 'string', 'example': '获取失败'}
                }
            }
        }
    }
})
def get_user_banners():
    """获取用户端有效Banner列表"""
    try:
        banners = Banner.get_active_banners()
        
        banner_list = []
        for banner in banners:
            banner_data = {
                'id': banner.id,
                'title': banner.title,
                'description': banner.description,
                'image_url': banner.image_url,
                'link_url': banner.link_url,
                'link_type': banner.link_type,
                'link_target': banner.link_target,
                'link_appid': banner.link_appid,
                'sort_order': banner.sort_order
            }
            banner_list.append(banner_data)
        
        return success_response({
            'banners': banner_list
        }, '获取成功')
        
    except Exception as e:
        current_app.logger.error(f"获取用户Banner列表失败: {str(e)}")
        return error_response('获取失败', 500)

@user_banner_bp.route('/banners/<int:banner_id>/click', methods=['POST'])
@swag_from({
    'tags': ['Banner'],
    'summary': 'Banner点击统计',
    'description': '记录Banner点击次数并返回跳转信息。每次调用会将该Banner的点击次数增加1，同时返回跳转相关信息供前端处理。',
    'parameters': [
        {
            'name': 'banner_id',
            'in': 'path',
            'type': 'integer',
            'required': True,
            'description': '要统计点击的Banner ID'
        }
    ],
    'responses': {
        200: {
            'description': '点击记录成功',
            'schema': {
                'type': 'object',
                'properties': {
                    'code': {'type': 'integer', 'example': 200, 'description': '状态码'},
                    'message': {'type': 'string', 'example': '点击记录成功', 'description': '响应消息'},
                    'data': {
                        'type': 'object',
                        'description': '跳转信息',
                        'properties': {
                            'link_url': {'type': 'string', 'description': '跳转链接（external类型时使用）'},
                            'link_type': {'type': 'string', 'enum': ['external', 'internal', 'venue', 'miniprogram', 'none'], 'description': '跳转类型：external=外部链接，internal=内部页面，venue=场馆详情，miniprogram=小程序跳转，none=纯展示无跳转'},
                            'link_target': {'type': 'string', 'description': '跳转目标：internal类型为页面路径，venue类型为场馆ID，miniprogram类型为小程序页面路径'},
                            'link_appid': {'type': 'string', 'description': '小程序AppID（miniprogram类型时使用）'}
                        }
                    }
                }
            }
        },
        400: {
            'description': 'Banner已失效',
            'schema': {
                'type': 'object',
                'properties': {
                    'code': {'type': 'integer', 'example': 400},
                    'message': {'type': 'string', 'example': 'Banner已失效'}
                }
            }
        },
        404: {
            'description': 'Banner不存在',
            'schema': {
                'type': 'object',
                'properties': {
                    'code': {'type': 'integer', 'example': 404},
                    'message': {'type': 'string', 'example': 'Banner不存在'}
                }
            }
        },
        500: {
            'description': '服务器内部错误',
            'schema': {
                'type': 'object',
                'properties': {
                    'code': {'type': 'integer', 'example': 500},
                    'message': {'type': 'string', 'example': '点击记录失败'}
                }
            }
        }
    }
})
def click_banner(banner_id):
    """Banner点击统计"""
    try:
        # 验证banner_id格式
        if not isinstance(banner_id, int) or banner_id <= 0:
            return error_response('无效的Banner ID', 400)
        
        banner = Banner.query.get(banner_id)
        if not banner:
            return error_response('Banner不存在', 404)
        
        # 检查banner是否有效
        if not banner.is_active():
            return error_response('Banner已失效', 400)
        
        # 增加点击次数
        banner.increment_click()
        
        # 返回跳转信息
        response_data = {
            'link_url': banner.link_url,
            'link_type': banner.link_type,
            'link_target': banner.link_target,
            'link_appid': banner.link_appid
        }
        
        return success_response(response_data, '点击记录成功')
        
    except Exception as e:
        current_app.logger.error(f"Banner点击统计失败: {str(e)}")
        return error_response('点击记录失败', 500) 